#define max(a, b) ((a) > (b) ? (a) : (b))

int jump(int* nums, int numsSize) {
    // step 1# 特判：如果数组只有一个元素，不需要跳
    if (numsSize == 1) {
        return 0;
    }

    int count = 0;           // step 2# 记录跳跃次数
    int curDistance = 0;     // step 3# 当前跳跃能覆盖的最远距离
    int nextDistance = 0;    // step 4# 下一步跳跃能达到的最远距离

    // step 5# 遍历数组（到倒数第一个元素即可）
    for (int i = 0; i < numsSize - 1; i++) {
        // step 5.1# 计算从当前位置出发最远能跳到哪里
        nextDistance = max(nextDistance, i + nums[i]);

        // step 5.2# 如果到达了当前跳跃的边界，必须进行一次跳跃
        if (i == curDistance) {
            count++;                 // step 5.3# 跳跃次数+1
            curDistance = nextDistance; // step 5.4# 更新当前跳跃的覆盖范围

            // step 5.5# 如果当前能覆盖到或超过终点，提前结束
            if (curDistance >= numsSize - 1)
                break;
        }
    }

    // step 6# 返回跳跃次数
    return count;
}
